package gamebook;

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import persistencia.PMensajeGenerico;
import java.util.List;

public abstract class MensajeGenerico {

    private int id;
    private String contenido;
    private Date fecha;
    private UsuarioGenerico usuarioOrigen;
    private UsuarioGenerico usuarioDestino;

    public MensajeGenerico() {
        //Constructor Vacio
    }

    public MensajeGenerico(int id, String contenido, Date fecha, UsuarioGenerico usuarioOrigen, UsuarioGenerico usuarioDestino) {
        this.id = id;
        this.contenido = contenido;
        this.fecha = fecha;
        this.usuarioOrigen = usuarioOrigen;
        this.usuarioDestino = usuarioDestino;
    }

    public MensajeGenerico(String contenido, Date fecha, UsuarioGenerico usuarioOrigen, UsuarioGenerico usuarioDestino) {
        this.contenido = contenido;
        this.fecha = fecha;
        this.usuarioOrigen = usuarioOrigen;
        this.usuarioDestino = usuarioDestino;
    }

    public String getContenido() {
        return contenido;
    }

    public void setContenido(String contenido) {
        this.contenido = contenido;
    }

    public Date getFecha() {
        return fecha;
    }

    public void setFecha(Date fecha) {
        this.fecha = fecha;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public UsuarioGenerico getUsuarioDestino() {
        return usuarioDestino;
    }

    public void setUsuarioDestino(UsuarioGenerico usuarioDestino) {
        this.usuarioDestino = usuarioDestino;
    }

    public UsuarioGenerico getUsuarioOrigen() {
        return usuarioOrigen;
    }

    public void setUsuarioOrigen(UsuarioGenerico usuarioOrigen) {
        this.usuarioOrigen = usuarioOrigen;
    }

    /**
     * Da de alta cualquier tipo de mensajes
     * @return boolean
     */
    public boolean darAlta() {
        return PMensajeGenerico.darAltaBD(this);
    }

    /**
     * Actualiza los datos de un mensaje en caso de cambio
     * @return 
     */
    public boolean actualizar() {
        return PMensajeGenerico.actualizarBD(this);
    }

    /**
     * Retorna el mensaje, sea del tipo que sea cuya Id coincida con la indicada
     * @param usuario
     * @return 
     */
    public static MensajeGenerico seleccionarPorId(int id) {
        MensajeGenerico mensajeGenerico = null;
        mensajeGenerico = PMensajeGenerico.seleccionarPorIdBD(id);
        return mensajeGenerico;
    }

    /**
     * Retorna todo tipo de mensaje recibidas por un cierto usuario destino
     * @param usuario
     * @return 
     */
    public static List<MensajeGenerico> seleccionarPorDestinatario(UsuarioGenerico usuarioGenerico, int inicio, int fin) {
        List<MensajeGenerico> listMensaje = null;
        listMensaje = PMensajeGenerico.seleccionarPorDestinatarioBD(usuarioGenerico, TipoMensaje.todos, inicio, fin);
        return listMensaje;
    }

    /**
     * Retorna todo tipo de mensajes cuyo origen sea un cierto usuario
     * @param usuario
     * @return 
     */
    public static List<MensajeGenerico> seleccionarPorOrigen(UsuarioGenerico usuarioGenerico, int inicio, int fin) {
        List<MensajeGenerico> listMensaje = null;
        listMensaje = PMensajeGenerico.seleccionarPorOrigenBD(usuarioGenerico, TipoMensaje.todos, inicio, fin);
        return listMensaje;
    }

    /**
     * Retorna los comentarios que pertenecen a una cierta publicación
     * @param usuarioGenerico
     * @return 
     */
    public static List<MensajeGenerico> seleccionarPorPublicacion(MensajeGenerico mensajeGenerico) {
        List<MensajeGenerico> listMensaje = null;
        listMensaje = PMensajeGenerico.seleccionarPorPublicacionBD(mensajeGenerico);
        return listMensaje;
    }

    /**
     * Retorna el estado de un usuarioGenerico, que es la última publicación que hizo en su muro.
     * @param usuario
     * @return 
     */
    public static MensajeGenerico seleccionarEstado(UsuarioGenerico usuarioGenerico) {
        MensajeGenerico mensajeGenerico = null;
        mensajeGenerico = PMensajeGenerico.seleccionarEstadoBD(usuarioGenerico);
        return mensajeGenerico;
    }

    /**
     * Intenta borrar un mensaje genérico. En caso de ser una publicación, debe
     * borrar la foto primero (si la hubiese) y después la publicación. Si se trata
     * de una publicación y no consigue borrar la foto primero, no intentará borrar
     * la publicación y devolverá 'false'.
     * @return boolean true o false dependiendo de si todo salio bien o mal
     */
    public boolean borrar() {
        //Miramos si es una publicación
        if (this instanceof Publicacion) {
            Publicacion publicacion = (Publicacion) this;
            //Si es una publicación, miramos si tiene foto
            if (publicacion.getFoto() != null) {
                //Si tiene foto, borramos la foto primero
                boolean haBorrado = publicacion.getFoto().borrar();
                if (!haBorrado) {
                    //Si no ha podido borrar la foto, devolvemos false
                    return false;
                }
            }
        }
        //Borramos el mensaje y devolvemos true o false según se haya conseguido o no
        return PMensajeGenerico.borrarBD(this);
    }

    /**
     * Devuleve la fecha del mensaje en forma de String con la fecha expresada
     * en formato: "00/mes/0000" donde mes, es el nombre completo del mes en cuestión
     * @return String con la fecha formateada
     */
    public String getFechaString() {
        String[] nombreMes = new String[]{"Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"};
        String fechaString;
        Calendar cal = new GregorianCalendar();
        cal.setTime(fecha);
        String dia = Integer.toString(cal.get(Calendar.DAY_OF_MONTH));
        String mes = nombreMes[cal.get(Calendar.MONTH)];
        String año = Integer.toString(cal.get(Calendar.YEAR));
        fechaString = dia + "/" + mes + "/" + año;
        return fechaString;
    }

    /**
     * Devuelve un String que muestra cuánto tiempo hace de que se dio de alta
     * la publicación en cuestión. Se expresará en segundos, minutos, horas o
     * días según convenga más o si es muy antiguo, se expresa en el formato
     * de fecha que devuelve: getFechaString()
     * @return String con el tiempo que hace de la publicación o la fecha
     */
    public String getCuantoTiempo() {
        Date ahora = new Date();
        long milisegundos = ahora.getTime() - this.getFecha().getTime();
        String tiempo = "";
        if (milisegundos / (24 * 60 * 60 * 1000) > 7) {
            tiempo = this.getFechaString();
        } else if (milisegundos / (24 * 60 * 60 * 1000) > 0) {
            tiempo = "Hace " + (milisegundos / (24 * 60 * 60 * 1000)) + " dias.";
        } else if (milisegundos / (60 * 60 * 1000) > 0) {
            tiempo = "Hace " + (milisegundos / (60 * 60 * 1000)) + " horas.";
        } else if (milisegundos / (60 * 1000) > 0) {
            tiempo = "Hace " + (milisegundos / (60 * 1000)) + " minutos.";
        } else if (milisegundos / 1000 > 0) {
            tiempo = "Hace " + (milisegundos / 1000) + " segundos.";
        } else {
            tiempo = "Ahora";
        }
        return tiempo;
    }
}
